const merge = require('webpack-merge')
const common = require('./webpack.common')
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
const TerserWebpackPlugin = require('terser-webpack-plugin')
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const path = require('path')

module.exports = merge(common, {
  mode: 'production',
  plugins: [
    new CopyWebpackPlugin([
      {
        from: path.resolve(__dirname, './public/'),
        to: path.resolve(__dirname, './dist'),
        ignore: [/\.html|\.ejs/]
      }
    ]),
    new HardSourceWebpackPlugin() //为模块提供中间缓存步骤。为了查看结果，您需要使用此插件运行webpack两次：第一次构建将花费正常的时间。第二次构建将显着加快（大概提升90%的构建速度）
  ],
  optimization: {
    minimizer: [
      new OptimizeCssAssetsWebpackPlugin({
        //css压缩
        assetNameRegExp: /\.css$/g,
        cssProcessor: require('cssnano'),
        cssProcessorOptions: {
          safe: true,
          discardComments: { removeAll: true }
        },
        canPrint: true
      }),
      new TerserWebpackPlugin({
        //js压缩
        cache: true,
        parallel: true
      })
    ],
    splitChunks: {
      // 抽离公共文件
      // https://www.cnblogs.com/kwzm/p/10314438.html
      chunks: 'all', // 默认作用于异步chunk，值为all/initial/async/function(chunk),值为function时第一个参数为遍历所有入口chunk时的chunk模块，chunk._modules为chunk所有依赖的模块，通过chunk的名字和所有依赖模块的resource可以自由配置,会抽取所有满足条件chunk的公有模块，以及模块的所有依赖模块，包括css
      minSize: 30 * 1024, // 表示在压缩前的最小模块大小,默认值是30kb 共有的size大于30KB的文件
      maxSize: 70 * 1024, // 表示在压缩前的最大模块大小,默认值是0 标识不限制
      minChunks: 2, // 表示被引用次数，默认为1；
      maxAsyncRequests: 5, // 所有异步请求不得超过5个
      maxInitialRequests: 3, // 初始话并行请求不得超过3个
      automaticNameDelimiter: '~', // 名称分隔符，默认是~
      name: true, // 打包后的名称，默认是chunk的名字通过分隔符（默认是～）分隔
      cacheGroups: {
        // 设置缓存组用来抽取满足不同规则的chunk,下面以生成common为例
        vendors: {
          test: /[\\/]node_modules[\\/]/, // 表示只筛选从node_modules文件夹下引入的模块
          priority: -10,
          chunks: 'all'
        },
        commons: {
          name: 'commons',
          chunks: 'initial',
          minChunks: 2, //minChunks：表示被引用次数，默认为1；commons中minChunks为2，表示将被多次引用的代码抽离成commons
          reuseExistingChunk: true
        },
        default: {
          minChunks: 1,
          priority: -20,
          reuseExistingChunk: true
        }
      }
    }
  }
})
